/**********************************************************************
* COPYRIGHT NOTICE - HYPERSEN TECHNOLOGY
*
* Copyright (c) 2025 , Hypersen Technology, Inc.
*
* All rights reserved.
*
*======================================================================
* @projectName Theme
* @file themeanimation.h
* @brief 主题动画类
* @author   Jay
* @email    none
* @version  1.0.0
* @date     2025-10-08
* @license private & classified
*---------------------------------------------------------------------
* Remark:
* 【调用方式】
    // 创建主题切换动画对象
    ThemeAnimation* animation = new ThemeAnimation(this);
    connect(animation, &ThemeAnimation::animationFinished, this, []() {
        // 动画完成后的处理
        qDebug() << "Animation finished";
    });
    // 执行主题切换动画，切换到暗色主题
    animation->fadeToTheme(ThemeManager::ThemeQssEnum::Dark);
    // 开始淡入动画
    animation->fadeIn();
*======================================================================
* Change History:
*---------------------------------------------------------------------
* <Date>      | <Version>  | <Author>  | <Description>
*---------------------------------------------------------------------
* 2025-10-08  | V1.0.0     | Jay       | 主题管理器
**********************************************************************/
#ifndef THEME_ANIMATION_H
#define THEME_ANIMATION_H

#include <QObject>
#include <QPropertyAnimation>
#include <QWidget>

#include "thememanager.h"

/**
 * @brief 主题切换动画类
 * ThemeAnimation类用于实现主题切换时的动画效果，使用QPropertyAnimation实现平滑的过渡效果。
 */
class ThemeAnimation : public QObject {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口对象，默认为nullptr
     */
    explicit ThemeAnimation(QWidget* parent = nullptr);

    /**
       * @brief 开始淡出动画
       * @param startOpacity 起始透明度，默认为1.0（完全不透明）
       * @param endOpacity 结束透明度，默认为0.0（完全透明）
       */
    void fadeOut(qreal startOpacity = 1.0, qreal endOpacity = 0.0);

    /**
       * @brief 开始淡入动画
       * @param startOpacity 起始透明度，默认为0.0（完全透明）
       * @param endOpacity 结束透明度，默认为1.0（完全不透明）
       */
    void fadeIn(qreal startOpacity = 0.0, qreal endOpacity = 1.0);

    /**
       * @brief 执行完整主题切换动画
       * @param newTheme 目标主题名称
       */
    void fadeToTheme(ThemeManager::ThemeQssEnum theme);

    /**
       * @brief 执行完整主题切换动画
       * @param newTheme 目标主题名称
       */
    void fadeToTheme(const QString &theme);


private slots:
    /**
     * @brief 动画完成槽函数
     * 当主题切换动画完成时调用，用于清理资源或执行后续操作
     */
    void onAnimationFinished();

signals:
    /**
     * @brief 动画完成信号
     * 当所有动画（淡出和淡入）都完成后发出此信号
     */
    void animationFinished();

private:
    QPropertyAnimation* m_fadeAnimation;  ///< 淡入淡出动画对象
    QWidget* m_parentWidget;              ///< 父窗口对象
    QString m_pendingTheme;               ///< 待切换的主题
};

#endif // THEME_ANIMATION_H
